package trabalho.pkg3;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

//Nó servidor central
//Contém a lista de nós na rede
//Contém a lista de arquivos que cada nó possui

public class NoMaster extends Thread
{
    private ServerSocket servidor;
    private Socket socket;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    private String msg;
    private ListaNos lista;   

    public NoMaster(int port) throws IOException
    {
        servidor = new ServerSocket(port); //Servidor porta 60050
        lista = new ListaNos();
    }

    @Override
    public void run()
    {
        while(true)
        {
            try
            {
                socket = servidor.accept(); //Aceita conexão
                out = new ObjectOutputStream(socket.getOutputStream()); //Buffer de envio dados
                in = new ObjectInputStream(socket.getInputStream()); //Buffer de recebimento dados

                msg = (String) in.readObject();
                switch (msg)
                {
                    case "Adicionar":
                        lista.getNoNome().add(servidor.getInetAddress().getHostName());
                        lista.getNoIp().add(servidor.getInetAddress().getHostAddress());
                        sendMessage("Adicionado com sucesso");
                        break;
                    case "Remover":
                        lista.remove(servidor.getInetAddress().getHostName());
                        sendMessage("Removido com Sucesso");
                        break;
                    case "Atualizar":

                        break;
                        
                    case "Download":
                        msg = (String) in.readObject();
                        InfoArq aux = new InfoArq(msg);
                        if(!aux.load())
                        {
                            out.flush();
                            out.writeObject("Arquivo não existe");
                        } else
                        {
                            out.flush();
                            out.writeObject(aux.getHosts());
                        }
                        break;
                }

                in.close();
                out.close();
                socket.close();

            } catch(ClassNotFoundException | IOException ex)
            {
                Logger.getLogger(NoMaster.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    //Envia menssagem via socket
    void sendMessage(String msg)
    {
        try
        {
            out.writeObject(msg);
            out.flush();
        } catch(IOException ioException)
        {
            ioException.printStackTrace();
        }
    }
}